///////////////////////
/// 数据结构和算法
///////////////////////

/**
 * 行列互换函数
 * @param  {array} arr       输入的原始数组, 一维数组
 * @param  {Num}   rowSize   每行的列个数
 * @return {array} resultArr 新的数组
 */
function changeXY(arr, rowSize) {
	var resultArr = [],
		iNow	  = 0;

	(function() {
		if (iNow == rowSize) return;
		for (var i = 0; i < arr.length; i++) {
			if (i % rowSize == iNow) {
				resultArr.push(arr[i]);
			}
		};
		iNow++;
		arguments.callee();
	})();

	return resultArr;
}

/**
 * 排列函数
 * @param  Array arr 输入数组
 * @param  Num   num 取出的排列个数
 * @return Array     前几位表示排列的可能性，最后一位表示排列的情况数
 */
function arrange(arr, num) {
	var resultArr = [],
		resultNum = 0,
		iLayer    = 1;	//当前在第几层
	if (num == 1) {
		resultArr = arr.concat();
		resultNum = arr.length;
	};

	function change(arr, iLayer, str) {
		for (var i = 0; i < arr.length; i++) {
			var arrClone  = arr.concat();
			var strClone = str + arrClone.splice(i, 1);

			if (num == iLayer) {
				for (var j = 0; j < arrClone.length; j++) {
					resultArr.push(strClone + arrClone[j]);
				};
				resultNum += arrClone.length;
			} else {
				change(arrClone, iLayer+1, strClone);
			}
		};
	}

	//是从第二层开始执行，第一层通过for循环得出
	change(arr, iLayer+1, '');
	resultArr.push(resultNum);

	return resultArr;
}


/**
 * 组合函数
 * @param  Array arr 输入数组
 * @param  Num   num 取出的组合个数
 * @return Array     前几位表示组合的可能性，最后一位表示排列的情况数
 */
function combination(arr, num) {
	var resultArr = [],
		resultNum = 0,
		iLayer    = 1;	//当前在第几层
	if (num == 1) {
		resultArr = arr.concat();
		resultNum = arr.length;
	};

	function change(arr, iLayer, str) {
		for (var i = 0; i < arr.length; i++) {
			var arrClone  = arr.concat();
			var strClone = str + arrClone.splice(i, 1);

			if (num == iLayer) {
				for (var j = 0; j < arrClone.length; j++) {
					resultArr.push(strClone + arrClone[j]);
				};
				resultNum += arrClone.length;
			} else {
				change(arrClone, iLayer+1, strClone);
			}
		};
	}

	//是从第二层开始执行，第一层通过for循环得出
	change(arr, iLayer+1, '');
	resultArr = unique(resultArr);
	resultArr.push(resultArr.length);

	return resultArr;
}

/**
 * 过滤数组并获得唯一值的数组
 * @param  Array arr       输入数组
 * @return Array resultArr 输出的唯一数组
 */
function unique(arr) {
	var validator = {};
	var resultArr = [];

	for (var i = 0; i < arr.length; i++) {
		var key = arr[i].split('').sort().join('');
		if (!validator[key]) {
			resultArr.push(arr[i]);
			validator[key] = 1;
		};
	};
	return resultArr;
}

